﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Biblio.Domain;
using System.Data;

namespace Biblio.DataAccess
{
    public class MaterialRepo
    {
        private BiblioDbContext ctx;

        public MaterialRepo(BiblioDbContext ctx) 
        {
            this.ctx = ctx;
        }

        public IList<Material> Todas()
        {
            return this.ctx.Materiales.ToList();
        }

        public Material Obtener(int id)
        {
            return this.ctx.Materiales.Find(id);

        }

        public Material BuscarPorCodigo(int codigo)
        {
            return this.ctx.Materiales
                .Where(m => m.Codigo == codigo).FirstOrDefault();
        }

        public IList<Material> BuscarPorTitulo(string titulo)
        {
            IList<Material> materiales = new List<Material>();
            foreach (Material m in this.ctx.Materiales)
            {
                if (m.Titulo.Equals(titulo, System.StringComparison.InvariantCultureIgnoreCase))
                     materiales.Add(m);
            }
            return materiales;
        }

        public IList<Material> BuscarPorGenero(string genero)
        {
            IList<string> generos = new List<string>();
            IList<Material> materiales = new List<Material>();
            foreach (Material m in this.ctx.Materiales)
            {
                generos = m.Generos;
                foreach(string gSolicitado in generos)
                {
                    if (gSolicitado.Equals(genero, System.StringComparison.InvariantCultureIgnoreCase))
                        materiales.Add(m);
                }
            }
            return materiales;
        }

        public IList<Material> BuscarPorAutor(Autor autor)
        {
            IList<Material> materiales = new List<Material>();
            IList<Autor> autores = new List<Autor>();
            string nombreBuscar = autor.Nombre;
            string apellidoBuscar = autor.Apellido;
            bool nombreCorrecto = false;
            bool apellidoCorrecto = false;

            foreach(Material m in this.ctx.Materiales) 
            {

                autores = m.Autores;

                foreach (Autor autorSolicitado in autores) 
                {
                    nombreCorrecto = autorSolicitado.Nombre.Equals(nombreBuscar, System.StringComparison.InvariantCultureIgnoreCase);
                    apellidoCorrecto = autorSolicitado.Apellido.Equals(apellidoBuscar, System.StringComparison.InvariantCultureIgnoreCase);

                    if (nombreCorrecto || apellidoCorrecto) 
                    {
                        materiales.Add(m);
                        break;
                    
                    }    
                }
           
            }
            return materiales;
        }

        public void Modificar(Material m)
        {
            this.ctx.Entry(m).State = EntityState.Modified;
            this.ctx.SaveChanges();
        }

        public void Agregar(Material r)
        {
            this.ctx.Materiales.Add(r);
            this.ctx.SaveChanges();
        }

        public void Eliminar(int id)
        {
            this.ctx.Materiales.Remove(Obtener(id));
            this.ctx.SaveChanges();//ejecuta todas las querys en el EntityFramework no ejecutada.Commit.
        }
    }
}